﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Grishko.UI;
using System.Web.UI.WebControls;
using OutdoorLib.BaseEntity.Dictionary;
using Grishko.DataTier;
using System.Text;
using System.IO;

namespace Grishko.UI
{
    /// <summary>
    /// Общий алгоритм; Дерево - кликнули - ветку - постбэк.
    /// 
    /// </summary>
    public class TreePostbackControl : TreeControl
    {
        /// <summary>
        /// Возвращает html контекстного меню
        /// </summary>
        /// <param name="CallParams"></param>
        /// <returns></returns>
        public   static string  GetContextMenu(string CallParams)
        {
            Grishko.UI.TreeContextMenu.MenuContextValue v=Grishko.UI.TreeContextMenu.MenuContextValue.Create(CallParams);
            string [] p= CallParams.Split(",".ToCharArray()[0]);
            Grishko.UI.TreeContextMenu m = new Grishko.UI.TreeContextMenu(v);
            return Grishko.UI.Tools.ContolToHTML(m);            
        }

        public const string ContextMenu_AddEventPref = "AddEvent_";
        public const string ContextMenu_RemoveEventPref = "RemoveEvent_";
        private const string EventArgPref = "_EventArg";
        private const string SelectNodePref = "_SelectNodePref";

        private string _WebServiceCallFormat = "";
                

        //Изменение ноды
        public Func<string, bool> OnSelectedNodeChanged ;

        //Добавить ноду
        public Func<string, bool> OnAddNode;

        //Удалить ноду
        public Func<string, bool> OnRemoveNode;

        /// <summary>
        /// форматирующая строка вызова web службы
        /// </summary>
        public string WebServiceCallFormat { get { return _WebServiceCallFormat; } set { _WebServiceCallFormat = value; } }
        /// <summary>
        /// Успех вызова службы
        /// </summary>
        public string WebServiceOnSuccess { get; set; }

        /// <summary>
        /// Ошибка вызова
        /// </summary>
        public string WebServiceOnError { get; set; }
        



        
        //Id  скрытого поля - хранилище событийного ID
        public string hf_EventArgID { get { return this.ID + EventArgPref ; } }

        
        //Id  скрытого поля - хранилище SelectedNode
        protected string hf_SelectNodeID { get { return this.ID + SelectNodePref; } }

        // Проверить наличие данных в hf_EventArgID - в зависимости от того что там- сгенерить событие
        protected override void OnLoad(EventArgs e)
        {
            
            if (this.DesignMode)
                return;

            SelectedNodeValue =   HttpContext.Current.Request.Form[hf_SelectNodeID];

            //Есть элемент событие в ViewState?
            object ev = HttpContext.Current.Request.Form[hf_EventArgID];
            if (null == ev)
                        return;
            

            string arg = ev.ToString();
            //Иногда - Какието ибучие запятые появляются... 
            if (arg.Length < 2)
                return;

            
                       
            arg = arg.Trim();


            //Тип события - добавить запись
            if (arg.IndexOf(ContextMenu_AddEventPref) > -1)
            {
                if (null != OnAddNode)
                {
                    SelectedNodeValue = arg.Replace(",", string.Empty).Replace(ContextMenu_AddEventPref, string.Empty);
                    OnAddNode(SelectedNodeValue);
                    return;
                }
            }

            //Тип события - удалить запись
            if (arg.IndexOf(ContextMenu_RemoveEventPref) > -1)
            {
                if (null != OnRemoveNode)
                {
                    SelectedNodeValue = arg.Replace(",", string.Empty).Replace(ContextMenu_RemoveEventPref, string.Empty);
                    OnRemoveNode(SelectedNodeValue);
                    return;
                }

            }


            // Событие выбрать элемент 
            if (null != OnSelectedNodeChanged)
            {
                SelectedNodeValue = arg.Replace(",", string.Empty);
                OnSelectedNodeChanged(arg.Replace(",", string.Empty));
            }

            base.OnLoad(e);
        }


        public string SelectedNodeValue
        {
            get;
            set;
        }

        public TreePostbackControl()
        {
            //
            // TODO: Add constructor logic here
            //
        }


        protected override void OnBefore_RenderControl(ref Panel Root)
        {
            ///Формируем хранилища для выбранных нод, ид папки справочника , ид типа справочника
            HiddenField hfEventNodeID1 = new HiddenField() { ID = hf_EventArgID, Value = "" };
            Root.Controls.Add(hfEventNodeID1);

            HiddenField hf = new HiddenField() { ID = hf_SelectNodeID, Value = SelectedNodeValue};
            Root.Controls.Add(hf);

        }

        public Func<string,string> GetCallContextMenuWS;

        protected override System.Web.UI.Control F_BuildNode(TreeEntitySingle nd)
        {
            Table tbl = new Table() { CellPadding = 0,CellSpacing =1 };
            TableRow rw = new TableRow();
            TableCell cl = new TableCell();

            System.Web.UI.Control res=null;

            //зовем внешнего прорисовщика
            res = Call_BuildNodeEvent(this, nd);
            
            if (null != res)
                        return res;
          
            LinkButton btn = new LinkButton();            
            btn.CssClass = (nd.ID == SelectedNodeValue ? CssSelectedNode : CssNode);
            btn.OnClientClick = "OnTreePostbackClick('" + hf_EventArgID + "','" + nd.ID + "');";

            if (null != GetCallContextMenuWS)
            {
                string s = GetCallContextMenuWS(nd.ID); 
                btn.Attributes.Add("onmousedown",s);
            }
            
            btn.Text = (nd as DictionaryItem).Value.ToString () ;
            btn.Font.Bold = (nd.ID == SelectedNodeValue);
            

            cl.Controls.Add(btn);
            
            rw.Cells.Add(cl);
            
            tbl.Rows.Add(rw);
            return tbl;


        }

 
    }
}